(*---cone with density gradient---*)cone2={Opacity[.3],EdgeForm[None],(*no outline*)LinearGradientFilling[{RGBColor[{0,0,0}],RGBColor[{0,0,1}]},1],Polygon[{{-2,5},{2,5},{1,0},{-1,0}}]};

blobStable[t_]:={RGBColor[{0,0,1-t}],(*rising centre& smaller amplitude*)With[{y=2+t,rx=0.2+0.15 t,ry=0.2+0.05 t},Disk[{0,y},{rx,ry}]]};

blobUnstable[t_]:={RGBColor[{0,0,t}],(*rising centre& growing axes*)With[{y=2+2 t,rx=0.2+0.3 t,ry=0.2+0.1 t},Disk[{0,y},{rx,ry}]]};

upArrow1[t_]:={Thick,Red, Arrowheads[{{.05,1}}],Arrow[{{0,2+2 t},{0,2+2 t-0.75*(1-t)}}]};

dnArrow1[t_]:={Thick,Red, Arrowheads[{{.05,1}}],Arrow[{{0,2+2 t},{0,2+2 t+0.75*(t)}}]};

upArrow2[t_]:={Thick,Red, Arrowheads[{{.05,1}}],Arrow[{{0,2+t},{0,2+t+0.375*(1-t)}}]};

dnArrow2[t_]:={Thick,Red, Arrowheads[{{.05,1}}],Arrow[{{0,2+t},{0,2+t-0.375*(t)}}]};

Manipulate[GraphicsGrid[{{"Bąbel konwekcyjnie niestabilny","Bąbel konwekcyjnie stabilny"},{Graphics[{cone2,blobUnstable[t],If[t<0.5,upArrow1[t],dnArrow1[t]]},PlotRange->{{-2,2},{0,5}},ImageSize->350,Axes->False],Graphics[{cone2,blobStable[t],If[t<0.5,upArrow2[t],dnArrow2[t]]},PlotRange->{{-2,2},{0,5}},ImageSize->350,Axes->False]}}],{{t,0.5},0,1}]

Obliczenia wykonamy stronami. Zakładamy, że zmiana ciśnienia WEWNĄTRZ bąbla zmienia się adiabatycznie.

Pb[r]==K ρb[r]^γ

D[%,r]

(%/.Equal->List)/(%%/.Equal->List)/.List->Equal

eqBlob=(Integrate[#,r]&)/@%

Podobny rachunek stronami wykonujemy dla materii NA ZEWNĄTRZ bąbla, gdzie zakładamy równanie stanu gazu doskonałego.

Ps[r]==kB ρs[r]Ts[r]/(mu μ)

D[%,r]

(%/.Equal->List)/(%%/.Equal->List)/.List->Equal//Simplify

eqStar=(Integrate[#,r]&)/@%

Teraz kluczowe są 2 założenia:
1. Ruch bąbla odbywa się na tyle wolno (tj. poniżej prędkości dźwięku ), że ciśnienia wewnątrz i na zewnątrz zdążą się wyrównać. 
2. Jeżeli gęstość wewnątrz bąbla maleje szybciej niż na zewnątrz, to siła wyporu przypiesza go coraz bardziej, prowadząc do niestabilności

warunekZaistnieniaKonwekcji =
{
eqStar, (* warunki w gwieździe, na zewnątrz bąbla *)
eqBlob,(* warunki wewnątrz bąbla *)
Log[Ps[r]]==Log[Pb[r]], (* War. równości ciśnień *)
Log[ρb[r]]==Log[ρs[r]] (* War. zerowania się siły wyporu: tu powinna być nierówność, ale Mathematica sobie z nią nie radzi. Wzór końcowy wychodzi ten sam.  *)
}

Są trzy standardowe formu warunku na konwekcję, w zależności od tego którą zmienną termodynamiczną wyeliminujemy: P, ρ czy T.

{Eliminate[warunekZaistnieniaKonwekcji,{Log[Pb[r]],Log[Ps[r]],Log[ρb[r]]}],Eliminate[warunekZaistnieniaKonwekcji,{Log[Pb[r]],Log[ρs[r]],Log[ρb[r]]}],Eliminate[warunekZaistnieniaKonwekcji,{Log[Pb[r]],Log[Ts[r]],Log[ρb[r]]}]}

Simplify[%]

D[%,r]

Powyższe wzory dla skrócenia często zapisuje się jako ilorazy pochodnych logarytmicznych.

Dociekliwy student powinien zapytać, co ww. warunek na konwekcję ma wspólnego z równaniem na transport energii w gwiazdach? Otóż ,,regułą kciuka’’ w astrofizyce jest przyjęcie, że transport konwektywny energii jest tak efektywny, że natychmiast sprowadza istniejący gradient temperatury w dół do momentu, w którym konwekcja ustaje (jest ledwie możliwa). To założenie pozwala po prostu użyć jednego z powyższych równań krytycznych, zawierającego T(r), jako równania różniczkowego ZASTĘPUJĄCEGO równanie transportu energii. W pierwszym   przybliżeniu okazuje się to być bardzo dobrym opisem faktyczniej sytuacji.